/**
 * @ author 汪孟苹
 * @ desc 动态表单的提醒功能中可复用的代码
 */
define(["jquery","bootstrap"], function ($,bootstrap) {
    var attention = {};

    /**
     * 获取配置的json提醒报文 (公共处理方法)
     */
    var getJson = function(dom){
        var str = dom.attr("data-attention");
        if( !str || str.trim().length == 0 ) return null;
        var json = JSON.parse( str );
        if( !json || json.length == 0 ) return null;
        return json;
    }

    /**
     * 根据规则rule获取总结果result
     * @return Boolean [布尔值]
     */
    var getResultByRule = function(obj,callback){
        if( obj.type ){
            if( !obj.rule ){
                obj.result = true;
            }else if( typeof obj.rule == "string" ){
                obj.result = eval(obj.rule).test(obj.value);
            }else if( typeof obj.rule == "object" && $.isArray(obj.rule) ){
                obj.result = true;
                for (var i = 0; i < obj.rule.length; i++) {
                    $.extend(obj.rule[i],{"value":obj.value});
                    obj.result = obj.result && callback(obj.rule[i]);
                }
            }else if( typeof obj.rule == "object" && !$.isArray(obj.rule) ){
                $.extend(obj.rule,{"value":obj.value});
                obj.result = callback(obj.rule);
            }
        }
        return obj;
    }

    /**
     * 提醒功能 入口
     */
    attention.init = function(params,callback1,callback2){
        // 获取配置的json提醒报文
        var arr = getJson(params.dom);
        if( arr ){
            for (var i = 0; i < arr.length; i++) {
                $.extend(arr[i],params);
                arr[i] = getResultByRule(arr[i],callback1);
                callback2(arr[i]);
            }
        }
    }

    /**
     * 根据单个规则rule获取单个规则的结果result(公用部分，各个题型的私有规则在各个题型里写)
     * @return Boolean [布尔值]
     */
    attention.handleByRule = function(obj){
        var result;
        switch(obj.type) {
            case "noNull":  // 非空
                result = noNull(obj);
                break;
            case "domain":  // 定义域
                result = domain(obj);
                break;
            case "regular": // 正则
                result = regular(obj);
                break;
        }
        return result;
    }

    /**
     * 根据提醒类型(type)执行对应的方法(公用部分，各个题型的私有醒类型在各个题型里写)
     */
    attention.handleBytype = function(obj){
        if( obj.type ){
            switch(obj.type) {
                case "tips_noNull":  // 非空提醒
                    tips_noNull(obj);
                    break;
                case "text_warn":    // 文字警告提醒
                    text_warn(obj);
                    break;
                case "tips_icon":    // 图标提醒
                    tips_icon(obj);
                    break;
            }
        }
    }

    /******************** 公用提醒类型(type) begin ********************/

    /**
     * 非空提醒
     */
    var tips_noNull = function(obj){
        view_tips_noNull(obj);
    }

    /**
     * 文字提醒
     */
    var text_warn = function(obj){
        view_text_warn(obj)
    }

    /**
     * 图标提示
     */
    var tips_icon = function(obj){
        view_tips_icon(obj)
    }

    /******************** 公用提醒类型(type) end ********************/

    /******************** 公用提醒规则(rule) begin ********************/

    /**
     * 提醒规则 非空
     */
    var noNull = function(arg){
        var success = arg.value && arg.value != "" ? true : false;
        return success;
    }

    /**
     * 提醒规则 定义域
     */
    var domain = function(arg){
        var _default = { "val":"[0,+∞)" };
        var params = $.extend({},_default,arg);
        var success;
        if( params.value ){
            var type01 = params.val.substr(0,1);
            var type02 = params.val.substr(params.val.length-1,1);
            var numArr = params.val.substr(1,params.val.length-2).split(",");
            var num01 = numArr[0];
            var num02 = numArr[1];
            if( num01 == "-∞" ){
                success = getResultDomain(params.value,type02,num02);
            }else if( num02 == "+∞" ){
                success = getResultDomain(params.value,type01,num01);
            }else{
                var success1 = getResultDomain(params.value,type01,num01);
                var success2 = getResultDomain(params.value,type02,num02);
                success = success1 && success2;
            }
        }
        return success;
    }
    // 获取结果 (提醒规则 定义域)
    var getResultDomain = function(value,type,num){
        var success;
        if( type == "[" ){
            success = Number(value) >= Number(num) ? true : false;
        }else if( type == "(" ){
            success = Number(value) > Number(num) ? true : false;
        }else if( type == "]" ){
            success = Number(value) <= Number(num) ? true : false;
        }else if( type == ")" ){
            success = Number(value) < Number(num) ? true : false;
        }
        return success;
    }

    /**
     * 提醒规则 正则匹配
     */
    var regular = function(params){
        var success;
        if( params.value && params.val ){
            var success = eval(params.val).test(params.value);
        }
        return success;
    }
    
    /******************** 公用提醒规则(rule) end ********************/

    /******************** 公用表现形式(view) begin ********************/

    /**
     * 加红*
     */
    var view_tips_noNull = function(obj){
        if( obj.result ){
            var $label = obj.dom.parents(".qaCard").find("label.control-label");
            if( $label.find("i.not-null").length == 0 ) $label.prepend('<i class="not-null">*</i>');
        }
    }

    /**
     * 设置文字颜色
     */
    var view_text_warn = function(obj){
        if( obj.result ){
            obj.dom.addClass("text-success").removeClass("text-warning");
        }else{
            obj.dom.addClass("text-warning").removeClass("text-success");
        }
    }

    /**
     * 图标提示
     */
    var view_tips_icon = function(obj){
        if( obj.result ){
            var $dom = obj.dom.parents(".qaCard");
            if( !obj.view ) obj.view = {};
            if( !obj.view.icon ) obj.view.icon = "fa fa-question-circle";
            if( !obj.view.color ) obj.view.color = "#00E0BF";
            if( !obj.view.msg ) obj.view.msg = "提示";
            var h = '<i class="control-icon control-icon-1 '+ obj.view.icon +'" style="color:'+ obj.view.color +'" data-toggle="tooltip" data-placement="left" title="'+ obj.view.msg +'"></i>';
            if( $dom.find("i.control-icon").length == 0 ) $dom.append(h);
            $(function(){$('[data-toggle="tooltip"]').tooltip()});
        }
    }

    /******************** 公用表现形式(view) end ********************/

    return attention;
});